package asientos;

import java.math.BigDecimal;

import com.lanchita.excepciones.CodigoErroneoException;
import com.lanchita.excepciones.EstadoErroneoException;

import despegar.utiles.Fecha;
import usuarios.Usuario;
import aerolineas.LanchitaWrapper;
import aerolineas.NombresAerolineas;

/**
 * Esta clase representa un asiento de la aerol�nea Lanchita.
 */
public class AsientoLanchita extends Asiento {
	private LanchitaWrapper aerolinea;
	
	/* *************************************************
	 * CONSTRUCTORS
	 **************************************************/
	public AsientoLanchita(
			LanchitaWrapper aerolinea,
			String origen, 
			String destino, 
			Fecha fechaDeSalida, 
			Fecha fechaDeLlegada, 
			String horaDeSalida, 
			String horaDeLlegada, 
			String codigoDeAsiento, 
			BigDecimal precioOriginal, 
			ClaseDeAsiento clase, 
			UbicacionesAsiento ubicacion, 
			String estado) {
		this.setAerolinea(aerolinea);
		this.setOrigen(origen);
		this.setDestino(destino);
		this.setFechaDeSalida(fechaDeSalida);
		this.setFechaDeLlegada(fechaDeLlegada);
		this.setHoraDeSalida(horaDeSalida);
		this.setHoraDeLlegada(horaDeLlegada);
		this.setNumeroDeAsiento(codigoDeAsiento);
		this.setCodigoDeVuelo(codigoDeAsiento);
		this.setPrecio(precioOriginal);
		this.setClase(clase);
		this.setUbicacion(ubicacion);
		this.setEstado(estado);
	}
	
	/* *************************************************
	 * SETTERS
	 **************************************************/
	private void setAerolinea(LanchitaWrapper aerolinea) {
		this.aerolinea = aerolinea;
	}
	protected void setNumeroDeAsiento(String codigoDeAsiento) {
		String[] chunks = codigoDeAsiento.split("-");
		this.setNumeroDeAsiento(Integer.parseInt(chunks[1]));
	}
	@Override
	protected void setCodigoDeVuelo(String codigoDeAsiento) {
		String[] chunks = codigoDeAsiento.split("-");
		this.codigoDeVuelo = chunks[0];
	}
	protected void setEstado(String estado) {
		if(estado.equals("D")) {
			this.setEstado(EstadosAsiento.DISPONIBLE);
		}
		else if(estado.equals("R")) {
			this.setEstado(EstadosAsiento.RESERVADO);
		}
		else if(estado.equals("C")) {
			this.setEstado(EstadosAsiento.COMPRADO);
		}
	}

	/* ************************************************
	 * GETTERS:
	 *************************************************/
	private String getCodigoDeAsiento() {
		return this.getCodigoDeVuelo() + "-" + this.getNumeroDeAsiento();
	}
	/* ************************************************
	 * API:
	 *************************************************/
	@Override
	public void reservar(Usuario usuarioQueReserva) {
		try {
			this.aerolinea.reservar(this.getCodigoDeAsiento(), usuarioQueReserva.getDni());
			this.setEstado(EstadosAsiento.RESERVADO);
			usuarioQueReserva.registrarReserva(this);
			this.registrarReserva(usuarioQueReserva.getDni());
		}
		catch(EstadoErroneoException e) {
			throw new EstadoDeAsientoIncorrectoException(e);
		}
		catch(CodigoErroneoException e) {
			throw new CodigoDeAsientoInvalidoException(e);
		}
	}
	@Override
	public void comprar(Usuario usuarioQueCompra) {
		try {
			if ((this.getEstado().equals(EstadosAsiento.RESERVADO))&&(this.registroReservas.get(0).equals(usuarioQueCompra.getDni()))) {
				usuarioQueCompra.eliminarReserva(this);
			} else {
				this.aerolinea.comprar(this.getCodigoDeAsiento());
			}		
			
						
			this.setEstado(EstadosAsiento.COMPRADO);
			usuarioQueCompra.registrarCompra(this);
		}
		catch(EstadoErroneoException e) {
			throw new EstadoDeAsientoIncorrectoException(e);
		}
		catch(CodigoErroneoException e) {
			throw new CodigoDeAsientoInvalidoException(e);
		}
	}
	@Override
	public boolean sosDeLaAerolinea(String nombreDeLaAerolinea) {
		return nombreDeLaAerolinea.equals(NombresAerolineas.LANCHITA);
	}

	@Override
	public String getAerolinea() {
		return NombresAerolineas.LANCHITA;
	}
}
